#include <lvgl.h>//lv_conf.h    文件里使用tft库打开， 使用之前配置好  tft库  使用的屏幕，以及SPI相关引脚
#include <TFT_eSPI.h>
#include <Ticker.h>//定时器
#include "tian_qi.h"
#include"ui.h"//squareline studio UI导入
//#include "ui_event.h"//squareline studio
#include "indev.h"





// 定义定时器对象
Ticker timer;//定时器

//#define BUFF_SIZE 240*240 /30 //lvgl屏幕初始化定义创建缓冲区大小 最小长乘宽除以十
//static lv_color_t buf_1[BUFF_SIZE];
#define BUFF_SIZE2 240*240*1.18  //将外部2M ram全部用于lvgl缓存



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//时间处理
int a_year = 2024;
int a_month = 07;
int a_day = 11;
int a_hour = 15;
int a_minute = 55;
int a_second = 55;
int a_msecond = 0;
int all_time[14];


//校准时间   时间更新成功返回真否则假  时间获取成功才更新数据
int new_time(){
  int chi_shu = 0;
  int ct = 1;
  while(de_time2=="null" && chi_shu <=10){
      get_time();
      delay(10);
      chi_shu++;
  }
  if(chi_shu==11) { /* 获取时间失败  *//*fan_hui = "时间校准失败请检查网络连接"; */ ct = 0 ;goto go;}
  for(int i = 0; i <=14 ; i++){
  all_time[i]=char(de_time1[i])-'0';//将字符变为整数
  } 

a_year = all_time[0]*1000+all_time[1]*100+all_time[2]*10+all_time[3];
a_month = all_time[4]*10+all_time[5];
a_day = all_time[6]*10+all_time[7];
a_hour = all_time[8]*10+all_time[9];
a_minute = all_time[10]*10+all_time[11];
a_second = all_time[12]*10+all_time[13];
go:
de_time2="null";
return ct;
}
//定时中断回调1ms执行一次
void flash(int tt) {  
  lv_tick_inc(1);//lvgl系统时间 1 ms 调用一次  停止心跳即暂停lvgl的运行
  a_msecond++;
  
  if(a_msecond==1000){

   a_second++;
   if(a_second==60){
    a_minute++;
    a_second=0;
   }
   if(a_minute==60){
    a_hour++;
    a_minute=0;
    tian_wifi_init();
    new_time();
    get_hour_tianqi();
    tian_wifi_end();
   }
    if(a_hour==24){
    a_day++;
    a_hour=0;
    tian_wifi_init();
    get_day_tianqi();
    tian_wifi_end();
   }
   switch(a_month){
   case 1: if(a_day==32){a_month++;a_day=1;} break;
   case 2: if(a_day==29){a_month++;a_day=1;} break;
   case 3:if(a_day==32){a_month++;a_day=1;} break;
   case 4: if(a_day==31){a_month++;a_day=1;} break;
   case 5:if(a_day==32){a_month++;a_day=1;} break;
   case 6: if(a_day==31){a_month++;a_day=1;} break;
   case 7:if(a_day==32){a_month++;a_day=1;} break;
   case 8:if(a_day==32){a_month++;a_day=1;} break;
   case 9: if(a_day==31){a_month++;a_day=1;} break;
   case 10:if(a_day==32){a_month++;a_day=1;} break;
   case 11:if(a_day==31){a_month++;a_day=1;} break;
   case 12:if(a_day==32){a_year++;a_month=1;a_day=1;} break;
   default: break;
   }
   a_msecond=0;  
  
  }  
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////



void setup() {


//外部ram   psram 中创建数组  需要注意计算实际RAM大小 如果超出物理大小程序运行时会卡死，编译过程不会报错
psramInit();//外部ram初始化,需要在工具里面使能psram
lv_color_t *buf_2 = (lv_color_t *) ps_malloc(BUFF_SIZE2 * sizeof(lv_color_t)); //Create an integer array of BUFF_SIZE2
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

my_key_init();


// 配置周期性定时器
  timer.attach(0.001, flash, 1);//时间(秒)，回调，输入到回调函数的值    //使用中断回调函数1 ms 调用一次 告诉lvgl运行时间

//初始化LVGL 屏幕 
  lv_init();
  lv_display_t * disp;
  disp = lv_tft_espi_create(240, 240, buf_2,BUFF_SIZE2);//屏幕宽，高，缓冲区，缓冲区大小
//创建旋转编码器为输入设备
  /*Register at least one display before you register any input devices*/
  static lv_indev_t * indev = lv_indev_create();
  lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER);   /*See below.*/
  lv_indev_set_read_cb(indev, encoder_read);  /*See below.*/  //绑定输入设备的回调函数
  lv_indev_read(indev);
  /* 创建group 后面将控件绑定到组即绑定到输入设备 */
  lv_group_t * group = lv_group_create();
  lv_group_set_default(group);//创建默认组，设备可操作ui控件
  lv_indev_set_group(indev, group);
  
  ui_init();//squareline  UI  使用初始化

  //lv_tick_set_cb(millis);    //Arduino告知lvgl自启动以来过去了多少时间，很重要必须有，这样才能正常运行

}


/////////////////////////////////////////////////////////////////////////////////////////////////////////

void newtime(lv_event_t * e)
{
	// Your code here
  
  if(new_time()){}
  else {_ui_label_set_property(ui_Label28,_UI_LABEL_PROPERTY_TEXT,String("network_erro").c_str());}
}

void setcity(lv_event_t * e)
{
	// Your code here
  String cg = "地点设置成功";
  String sb = "地点设置失败请检查位置格式或网络连接是否正确";
  location_ip = lv_textarea_get_text(ui_TextArea1);
  tian_wifi_init();
 get_hour_tianqi();
 get_day_tianqi();
  if(Status_code=="ok"){
    _ui_label_set_property(ui_Label22,_UI_LABEL_PROPERTY_TEXT,cg.c_str());
    _ui_label_set_property(ui_Label28,_UI_LABEL_PROPERTY_TEXT,String("wifi_on").c_str());
  }
  else{_ui_label_set_property(ui_Label22,_UI_LABEL_PROPERTY_TEXT,sb.c_str());   }

}

void setwifi(lv_event_t * e)
{
	// Your code here
   ssid = lv_textarea_get_text(ui_TextArea2);//获取文本框输入的文本
   password = lv_textarea_get_text(ui_TextArea3);
   //tian_wifi_init ();
   //_ui_label_set_property(ui_Label28,_UI_LABEL_PROPERTY_TEXT,String("wifi_on").c_str());

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


void loop() {
  
  lv_timer_handler();
  delay(5);//要加延时不然有可能系统会死机
   if(a_minute<10){_ui_label_set_property(ui_Label4,_UI_LABEL_PROPERTY_TEXT,(String(a_hour)+":0"+String(a_minute)).c_str());}
   else{_ui_label_set_property(ui_Label4,_UI_LABEL_PROPERTY_TEXT,(String(a_hour)+":"+String(a_minute)).c_str());}
   _ui_label_set_property(ui_Label5,_UI_LABEL_PROPERTY_TEXT,String(a_second).c_str());
   _ui_label_set_property(ui_Label3,_UI_LABEL_PROPERTY_TEXT,(String(a_year)+"\n"+String(a_month)+"/"+String(a_day)).c_str());

   
}







